package com.winsdom.mapper.customer;

import org.apache.ibatis.annotations.*;

import java.util.List;
import java.util.Map;

/**
 * 企业客户信息更新相关的数据访问接口，提供企业客户信息更新过程中涉及的各类数据操作。
 * 该接口包含了更新客户基本信息、企业信息、联系人信息、地址信息、证书信息等相关方法。
 */
public interface CustomerEnterpriseUpdateMapper {

    /**
     * 更新客户基本信息
     * @param params 参数Map，应包含customerId和需要更新的字段及值
     */
    void updateCustomerBaseInfo(Map<String, Object> params);

    /**
     * 更新企业客户特定信息
     * @param params 参数Map，应包含customerId和需要更新的企业字段及值
     */
    void updateCustomerEnterpriseInfo(Map<String, Object> params);

    /**
     * 根据客户ID获取联系人信息，返回以联系人为键的映射列表
     * @param customerId 客户ID
     * @return 返回一个映射，键为联系人名称，值为包含联系人详细信息的映射
     */
    @MapKey("name")
    Map<String, Map<String, Object>> getContactIdsByCustomerId(@Param("customerId") Long customerId);

    /**
     * 更新联系人信息
     * @param contactId 联系人ID
     * @param mobilePhone 手机号码
     * @param email 电子邮箱
     */
    void updateContactInfo(@Param("contactId") Long contactId,
                           @Param("mobilePhone") String mobilePhone,
                           @Param("email") String email);

    /**
     * 删除联系人的属性关联信息
     * @param contactId 联系人ID
     */
    void deleteContactProperties(@Param("contactId") Long contactId);

    /**
     * 插入联系人的属性关联信息
     * @param contactId 联系人ID
     * @param propertyId 属性ID
     */
    void insertContactProperty(@Param("contactId") Long contactId, @Param("propertyId") Integer propertyId);

    /**
     * 获取客户指定类型的地址ID
     * @param customerId 客户ID
     * @param addressType 地址类型
     * @return 地址ID，如果不存在则返回null
     */
    Integer getAddressId(@Param("customerId") Long customerId, @Param("addressType") Integer addressType);

    /**
     * 更新客户地址信息
     * @param params 参数Map，应包含addressId和需要更新的地址字段及值
     */
    void updateCustomerAddress(Map<String, Object> params);

    /**
     * 插入客户地址信息
     * @param params 参数Map，应包含客户ID和地址相关字段及值
     */
    void insertCustomerAddress(Map<String, Object> params);

    /**
     * 获取客户证书ID
     * @param customerId 客户ID
     * @return 证书ID，如果不存在则返回null
     */
    Integer getCertificateId(@Param("customerId") Long customerId);

    /**
     * 更新营业执照图片路径
     * @param customerId 客户ID
     * @param filePath 图片文件路径
     */
    void updateBusinessLicenseImage(@Param("customerId") Long customerId, @Param("filePath") String filePath);

    /**
     * 插入营业执照图片路径
     * @param customerId 客户ID
     * @param filePath 图片文件路径
     */
    void insertBusinessLicenseImage(@Param("customerId") Long customerId, @Param("filePath") String filePath);

    /**
     * 根据属性名称列表获取属性ID列表
     * @param propertyNames 属性名称列表
     * @return 属性ID列表
     */
    List<Integer> getPropertyIdsByNames(@Param("propertyNames") List<String> propertyNames);

    /**
     * 根据客户ID查询企业客户基本信息，返回以客户ID为键的映射列表
     * @param customerId 客户ID
     * @return 返回一个列表，列表中的每个元素是一个Map，代表一条企业客户记录
     */
    @MapKey("name")
    List<Map<String, Object>> selectEnterpriseBasicInfo(Long customerId);
}